Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

Example 1:

  1. nums1 = [1, 3]
  2. nums2 = [2]
  3. The median is 2.0

Example 2:

  1. nums1 = [1, 2]
  2. nums2 = [3, 4]
  3. The median is (2 + 3)/2 = 2.5

Solution:

  1. public class Solution {
  2. public double findMedianSortedArrays(int[] nums1, int[] nums2) {
  3. int l1 = nums1.length;
  4. int l2 = nums2.length;
  5. int k = (l1 + l2) / 2;
  6. if ((l1 + l2) % 2 == 0) {
  7. return (helper(nums1, 0, l1 - 1, nums2, 0, l2 - 1, k) + helper(nums1, 0, l1 - 1, nums2, 0, l2 - 1, k + 1)) / 2.0;
  8. } else {
  9. return helper(nums1, 0, l1 - 1, nums2, 0, l2 - 1, k + 1);
  10. }
  11. }
  12. double helper(int[] a1, int i1, int j1, int[] a2, int i2, int j2, int k) {
  13. int l1 = j1 - i1 + 1;
  14. int l2 = j2 - i2 + 1;
  15. if (l1 > l2) {
  16. return helper(a2, i2, j2, a1, i1, j1, k);
  17. }
  18. if (l1 == 0) {
  19. return a2[i2 + k - 1];
  20. }
  21. if (k == 1) {
  22. return Math.min(a1[i1], a2[i2]);
  23. }
  24. int n1 = Math.min(k / 2, l1);
  25. int n2 = k - n1;
  26. int v1 = a1[i1 + n1 - 1];
  27. int v2 = a2[i2 + n2 - 1];
  28. if (v1 == v2) {
  29. return v1;
  30. } else if (v1 < v2) {
  31. return helper(a1, i1 + n1, j1, a2, i2, i2 + n2 - 1, k - n1);
  32. } else {
  33. return helper(a1, i1, i1 + n1 - 1, a2, i2 + n2, j2, k - n2);
  34. }
  35. }
  36. }